package cn.iocoder.yudao.module.erp.dal.mysql.dpitem;

import cn.hutool.core.date.DateTime;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.erp.controller.admin.dpitem.dpitemyw.vo.DpItemYwPageReqVO;
import cn.iocoder.yudao.module.erp.dal.dataobject.dpitem.DpItemYwDO;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;
import java.util.stream.Collectors;

/**
 * ERP义乌制单货号详情 Mapper
 * @author 天使管理员
 */
@Mapper
public interface DpItemYwMapper extends BaseMapperX<DpItemYwDO> {

    default PageResult<DpItemYwDO> selectPage(DpItemYwPageReqVO reqVO) {
        return selectPage(reqVO, new LambdaQueryWrapperX<DpItemYwDO>()
                .eqIfPresent(DpItemYwDO::getNo, reqVO.getNo())
                .eqIfPresent(DpItemYwDO::getType, reqVO.getType())
                .eqIfPresent(DpItemYwDO::getCount, reqVO.getCount())
                .eqIfPresent(DpItemYwDO::getLenth, reqVO.getLenth())
                .eqIfPresent(DpItemYwDO::getWide, reqVO.getWide())
                .eqIfPresent(DpItemYwDO::getHigh, reqVO.getHigh())
                .eqIfPresent(DpItemYwDO::getInVolume, reqVO.getInVolume())
                .eqIfPresent(DpItemYwDO::getWeight, reqVO.getWeight())
                .eqIfPresent(DpItemYwDO::getDensity, reqVO.getDensity())
                .eqIfPresent(DpItemYwDO::getIsSplit, reqVO.getIsSplit())
                .orderByDesc(DpItemYwDO::getId));
    }

    default List<DpItemYwDO> selectListByNo(String no) {
        return selectList(DpItemYwDO::getNo, no);
    };

//    default List<DpItemYwDO> selectListByNos(List<String> nos) {
//        return selectList(new LambdaQueryWrapper<DpItemYwDO>()
//                .in(DpItemYwDO::getNo, nos)
//                .select(DpItemYwDO::getId, DpItemYwDO::getNo))
//                .stream()
//                .map(item -> {
//                    DpItemYwDO dto = new DpItemYwDO();
//                    dto.setId(item.getId());
//                    dto.setNo(item.getNo());
//                    return dto;
//                }).collect(Collectors.toList());
//    }

    default int deleteByNo(String no) {
        return delete(DpItemYwDO::getNo, no);
    }


    default void updateDispatchNumberAndInventoryStatusByIds(List<Long> ids, String dispatchNumber, Integer inventoryStatus, String lineDetails) {
        // 检查参数是否为空
        if (ids == null || ids.isEmpty()) {
            return;
        }
        // 构建更新条件
        LambdaUpdateWrapper<DpItemYwDO> updateWrapper = new LambdaUpdateWrapper<DpItemYwDO>()
                .in(DpItemYwDO::getId, ids)
                .set(DpItemYwDO::getDispatchNumber, dispatchNumber)
                .set(DpItemYwDO::getInventoryStatus, inventoryStatus)
                .set(DpItemYwDO::getLineUpdateTime, new DateTime())
                .setSql("line_details = CONCAT(IFNULL(line_details, ''), '" + lineDetails + "')");  // 拼接 lineDetails
        // 执行更新操作
        update(null, updateWrapper);
    }


    default void updateInventoryStatusByIds(List<Integer> ids) {
        if (ids == null || ids.isEmpty()) {
            return; // 避免空列表导致无效操作
        }
        update(new LambdaUpdateWrapper<DpItemYwDO>()
                .in(DpItemYwDO::getId, ids) // 筛选条件：id 在 ids 列表中
                .set(DpItemYwDO::getInventoryStatus, 2)); // 设置 inventoryStatus 字段的值
    }

    default void updateListByIds(List<String> ids){
        update(new LambdaUpdateWrapper<DpItemYwDO>()
                .in(DpItemYwDO::getDispatchNumber, ids) // 筛选条件：id 在 ids 列表中
                .set(DpItemYwDO::getInventoryStatus, 2)); // 设置 inventoryStatus 字段的值
    };

    default List<Long> selectListByNos(List<String> nos) {
        return selectList(new LambdaQueryWrapper<DpItemYwDO>()
                .in(DpItemYwDO::getNo, nos)  // 条件：no 字段在 nos 列表中
                .select(DpItemYwDO::getId)) // 只查询 id 字段
                .stream()
                .map(DpItemYwDO::getId)     // 提取 id 字段值
                .collect(Collectors.toList()); // 收集到列表
    }

    default List<DpItemYwDO> selectListByInventoryStatus(String dispatchNumber) {
        return selectList(new LambdaQueryWrapperX<DpItemYwDO>()
                .eq(DpItemYwDO::getInventoryStatus, 1) // 出库状态为 1
                .likeIfPresent(DpItemYwDO::getDispatchNumber, dispatchNumber) // 动态模糊匹配 dispatchNumber
                .orderByDesc(DpItemYwDO::getId) // 根据 ID 倒序排列
        );
    }

    default List<DpItemYwDO> selectListByIDAndDispatchNumber(String id, String dispatchNumber) {
        return selectList(new LambdaQueryWrapperX<DpItemYwDO>()
                .eq(DpItemYwDO::getNo, id)
                .eq(DpItemYwDO::getDispatchNumber, dispatchNumber)
                .orderByDesc(DpItemYwDO::getId) // 根据 ID 倒序排列
        );
    }


}